Reference:
spin_lock_bh()与spin_unlock_bh()
Linux内核自旋锁
Linux自旋锁
Spinlock - Wikipedia, the free encyclopedia

本文地址:https://segmentfault.com/a/1190000005354100


原理

首先,spinlock是一把锁,它的功能与其他锁的作用类似,都是对用于临界区进行原子读写。使用这把锁时,原理上就是不停的循环检查锁的状态,直到可用的时候进入临界区。

与mutex的区别

Spinlock只进行虚幻检查,在内核中仍然允许抢占。
Mutex会立即引起调度,因而在一些中断处理函数中会出问题。

注意:
  由于是循环检查而已,因此临界区的大小应该限制,否则非常影响效率。
  选择自旋锁时,要注意考虑中断(软中断与硬中断;timer中断属于软中断)

函数和宏定义

头文件

#include <linux/spinlock.h>

静态初始化

spinlock_t a_lock = SPIN_LOCK_UNLOCKED;

宏定义和函数

动态初始化:

spin_lock_init(&a_lock);

判断自旋锁是否上锁:

spin_is_locked(&a_lock);

等待直到spinlock解锁

spin_unlock_wait(&a_lock);

进入和退出临界区

spin_lock(&a_lock);
spin_unlock(&a_lock);

保存状态寄存器值地进入和退出临界区

int flags;
spin_lock_irqsave(&a_lock, flags);
spin_unlock_irqrestore(&a_lock, flags);

屏蔽硬件中断地进入和退出临界区

spin_lock_irq(&a_lock);
spin_unlock_irq(&a_lock);

屏蔽底半部中断地进入和退出临界区

spin_lock_bh(&a_lock);
spin_unlock_bh(&a_lock);

amc
927 声望228 粉丝

电子和互联网深耕多年,拥有丰富的嵌入式和服务器开发经验。现负责腾讯心悦俱乐部后台开发